package com.jinmdz.app.api.base;

import com.jinmdz.app.api.constant.CacheKey;
import com.jinmdz.app.api.model.system.UserItem;
import com.jinmdz.app.api.wrapper.HandlerWrapper;
import com.jinmdz.fmis.core.base.BaseBean;
import com.jinmdz.fmis.core.base.BaseResult;
import com.jinmdz.fmis.core.base.RequestResponse;
import com.jinmdz.fmis.core.constant.Constants;
import com.jinmdz.fmis.core.constant.EResultCode;
import com.jinmdz.fmis.core.exception.ActionException;
import com.jinmdz.fmis.core.util.LogUtil;
import com.jinmdz.fmis.core.wrapper.ResultWrapper;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;

/**
 * 封装Handler基类
 *
 * @author LiCongLu
 * @date 2020-05-26 15:30
 */
public class BaseHandler extends RequestResponse {

    @Autowired
    protected HttpServletRequest request;

    @Override
    public HttpServletRequest getRequest() {
        return this.request;
    }

    public String getToken() {
        return this.request.getHeader(Constants.AUTHORIZATION);
    }

    @Resource
    private HandlerWrapper handlerWrapper;

    /**
     * 验证执行Handler操作
     *
     * @param listener 处理监听器
     * @return
     * @author LiCongLu
     * @date 2020-01-02 10:24
     */
    public BaseResult resultHandler(OnHandlerListener listener) {
        return resultHandler(new BaseBean(), false, listener);
    }

    /**
     * 验证执行Handler操作
     *
     * @param data     请求数据
     * @param listener 处理监听
     * @return
     * @author LiCongLu
     * @date 2020-01-09 15:45
     */
    public <T extends BaseBean> BaseResult resultHandler(T data, OnHandlerListener listener) {
        return resultHandler(data, true, listener);
    }

    /**
     * 验证执行Handler操作
     *
     * @param data         请求数据
     * @param validateFlag 是否验证数据
     * @param listener     处理监听
     * @return
     * @author LiCongLu
     * @date 2020-01-09 15:31
     */
    private <T extends BaseBean> BaseResult resultHandler(T data, boolean validateFlag, OnHandlerListener listener) {
        // 验证账号
        UserItem userItem = getBean(CacheKey.USER_ITEM, UserItem.class);
        if (userItem == null || userItem.getJobNo() == null) {
            return ResultWrapper.getResult(EResultCode.CODE2);
        }

        // 按照条件进行验证数据
        if (validateFlag) {
            // 需要验证请求数据的，请求数据不可为空
            if (data == null) {
                return ResultWrapper.failure("请求数据为空");
            }

            // 验证请求数据
            BaseResult result = handlerWrapper.validateBean(data);
            if (result != null) {
                return result;
            }
        }

        // 判断是否存在处理监听
        if (listener == null) {
            return ResultWrapper.failure("未执行处理操作");
        }

        try {
            // 处理执行
            return listener.onHandler(userItem);
        } catch (ActionException e) {
            LogUtil.info("请求异常，信息：" + e.getMessage());
            return ResultWrapper.failure(e.getMessage());
        }
    }

    /**
     * 验证执行Handler操作
     *
     * @param dataList 请求数据集合
     * @param listener 处理监听
     * @return
     * @author LiCongLu
     * @date 2020-01-09 15:45
     */
    public <T extends BaseBean> BaseResult resultHandler(ArrayList<T> dataList, OnHandlerListener listener) {
        return resultHandler(dataList, true, listener);
    }

    /**
     * 验证执行Handler操作
     *
     * @param dataList     请求数据集合
     * @param validateFlag 是否验证数据
     * @param listener     处理监听
     * @return
     * @author LiCongLu
     * @date 2020-03-10 09:53
     */
    private <T extends BaseBean> BaseResult resultHandler(ArrayList<T> dataList, boolean validateFlag, OnHandlerListener listener) {
        // 验证账号
        UserItem userItem = getBean(CacheKey.USER_ITEM, UserItem.class);
        if (userItem == null || userItem.getJobNo() == null) {
            return ResultWrapper.getResult(EResultCode.CODE2);
        }

        // 按照条件进行验证数据
        if (validateFlag) {
            // 需要验证请求数据的，请求数据不可为空
            if (dataList == null || dataList.size() == 0) {
                return ResultWrapper.failure("请求数据为空");
            }

            // 验证请求集合数据
            BaseResult result = handlerWrapper.validateList(dataList);
            if (result != null) {
                return result;
            }
        }

        // 判断是否存在处理监听
        if (listener == null) {
            return ResultWrapper.failure("未执行处理操作");
        }

        try {
            // 处理执行
            return listener.onHandler(userItem);
        } catch (ActionException e) {
            LogUtil.info("请求异常，信息：" + e.getMessage());
            return ResultWrapper.failure(e.getMessage());
        }
    }

    /**
     * OnHandlerListener
     *
     * @author LiCongLu
     * @date 2020-01-02 10:20
     */
    @FunctionalInterface
    public interface OnHandlerListener {
        /**
         * 实际执行Handler
         *
         * @param userItem 当前帐号
         * @return BaseResult
         * @throws ActionException
         * @author LiCongLu
         * @date 2020-01-02 10:21
         */
        BaseResult onHandler(UserItem userItem) throws ActionException;
    }
}
